#pragma once
#include <iostream>
#include <string>
#include <memory>
#include <vector>
#include <unistd.h>
#include <unordered_map>

// Session不用存放id, 直接将id以map key值的形式存放在组织结构中，通过用户的cookie来进行映射
class Session
{
public:
    Session(const std::string &name, const std::string &status = "")
        : _create_time(time(nullptr)), _survival_time(60) // 当前测试cookie先将时间存活设置成一分钟
          ,
          _user_name(name), _user_status(status), _is_vip_user(false)
    {
    }

private:
    // 存活时间以及创建时间
    uint64_t _create_time;
    uint64_t _survival_time;

    // 用户信息
    std::string _user_name;
    std::string _user_status;

    // vip用户以及用户当前可以访问的路径
    bool _is_vip_user;
    std::string _vip_path; // 没实现这个功能。
};

using SessionPtr = std::shared_ptr<Session>;
class SessionManager
{
public:
    SessionManager() {}

    std::string AddSession(std::string username)
    {
        SessionPtr session = std::make_shared<Session>(username);
        uint32_t randomid = rand() + time(nullptr); // 随机数+时间戳，实际有形成sessionid的库，比如boost uuid库，或者其他第三方库等
        std::string sessionid = std::to_string(randomid);
        _session_manager.insert(std::make_pair(sessionid, session));
        return sessionid;
    }

    SessionPtr GetSession(std::string sessionid)
    {
        if(_session_manager.count(sessionid))
        {
            return _session_manager[sessionid];
        }
        else
        {
            return nullptr;
        }
    }
    ~SessionManager() {}

private:
    std::unordered_map<std::string, SessionPtr> _session_manager;
};